package com.ming_za.odupdaterserver.core.exception;

import com.ming_za.odupdaterserver.core.utils.account.AccountRE;
import lombok.Getter;

/**
 * 请求异常返回code以及message
 * <pre>code详细说明：10 001</pre>
 * <pre>10 - 类型</pre>
 * <pre>001 - 具体错误</pre>
 */
@Getter
public enum ROEnum {
    SUCCESS(200,"成功"),
    /**
     * 由于程序问题，错误只在后台打印而不返回前端的异常
     */
    UNEXPECTED_ERROR(10001,"意外错误！请稍后重试"),
    /**
     * 单个用户请求超过程序设定数量，操作已频繁
     */
    FREQUENT_OPERATION(10002,"操作已频繁，请稍后重试"),
    /**
     * 用户，token失效
     */
    USER_TOKEN_FAILURE(20001,"身份验证已失效"),
    /**
     * 用户，账号已注册
     */
    USER_ACCOUNT_REGISTERED(20002,"该账号已注册"),
    /**
     * 用户，当前服务器无法远程登录
     */
    USER_REMOTE_LOGIN_ERROR(20003,"当前服务器已禁止远程登录"),
    /**
     * 用户，账号未注册
     */
    USER_ACCOUNT_UNREGISTERED(20004,"该账号未注册"),
    /**
     * 用户，账号或密码错误
     */
    USER_WRONG_ACCOUNT_OR_PASSWORD(20005,"账号或密码错误"),
    /**
     * 用户，没有权限执行该操作
     */
    USER_NO_PERMISSION(20007,"没有权限执行该操作"),
    /**
     * 用户，登录已锁定
     */
    USER_LOGIN_LOCK(20008,"登录已锁定"),
    /**
     * 更新，找不到标签
     */
    UPDATE_NOTFOUND_LABEL(30001,"找不到标签"),
    /**
     * 更新，找不到更新资源
     */
    UPDATE_NOTFOUND_RES(30002,"找不到更新资源"),
    /**
     * 更新，更新资源被拦截
     */
    UPDATE_RES_INTERCEPT(30003,"更新资源被拦截"),
    /**
     * 更新，下载通道已达到上限
     */
    UPDATE_MAXIMUM_DOWNLOAD(30004,"下载通道已达到上限"),
    /**
     * 更新，需要文件
     */
    UPDATE_NEED_FILE(30005,"需要文件"),
    /**
     * 更新，当前没有未发布版本
     */
    UPDATE_UNKNOWN_UNPUBLISHED_VERSION(30006,"当前没有未发布版本"),
    /**
     * 更新，已存在当前资源
     */
    UPDATE_RES_EXISTS(30007,"已存在当前资源"),
    /**
     * 更新，版本号必须大于旧版本
     */
    UPDATE_VERSION_MUST_BIGGER_THAN_OLD(30008,"版本号必须大于旧版本"),
    /**
     * 更新，找不到版本号
     */
    UPDATE_NOTFOUND_VERSION(30009,"找不到版本号"),
    /**
     * 更新，当前资源非发布内容
     */
    UPDATE_RES_UNPUBLISHED(30010,"当前资源非发布内容"),
    /**
     * 更新，内测密钥错误
     */
    UPDATE_UNPUBLISHED_KEY_ERROR(30011,"内测密钥错误"),
    /**
     * 更新，存在相同路径资源
     */
    UPDATE_CONFLICT_PATH_RES(30012,"存在更新冲突资源"),
    /**
     * 更新，已存在未发布版本
     */
    UPDATE_EXIST_UNPUBLISHED_VERSION(30013,"已存在未发布版本"),
    /**
     * 资源标签，标签不是独立标签
     */
    RES_LABEL_NOT_ALONE(40001,"标签不是独立标签"),
    /**
     * 资源标签，不允许循环继承
     */
    RES_LABEL_CYCLIC_EXTEND(40002,"标签不允许循环继承"),
    /**
     * JSON格式无效
     */
    JSON_FORMAT_NOT_INVALID(50001,"JSON格式无效"),
    /**
     * 数据格式无效
     */
    DATA_FORMAT_NOT_INVALID(50002,"数据格式无效"),
    /**
     * 数值无效
     */
    NUMBER_NOT_INVALID(50003,"数值无效"),
    /**
     * 文件，文件不能为空
     */
    FILE_IS_NULL(80001,"文件不能为空"),
    /**
     * 文件，文件名不能为空
     */
    FILE_NAME_IS_NULL(80002,"文件名不能为空"),
    /**
     * 文件，文件格式无效
     */
    FILE_FORMAT_NOT_INVALID(80003,"文件格式无效"),
    /**
     * 文件，文件上传失败
     */
    FILE_UPDATE_FAIL(80004,"文件上传失败"),
    /**
     * 文件，文件无法创建
     */
    FILE_UNABLE_TO_CREATE(80005,"文件无法创建"),
    /**
     * 配置，找不到配置名
     */
    SETTING_NOT_FOUND_NAME(90001,"找不到配置名"),
    /**
     * 配置，意外的类型
     */
    SETTING_UNEXPECTED_TYPE(90002,"意外的类型"),

    ;
    final int code;
    String defaultMsg;
    ROEnum(int code, String defaultMsg) {
        this.code = code;
        this.defaultMsg = defaultMsg;
    }

    public static ROEnum account(AccountRE accountRE) {
        return switch (accountRE) {
            case SUCCESS -> SUCCESS;
            case TOKEN_FAILURE -> USER_TOKEN_FAILURE;
            case ACCOUNT_REGISTERED -> USER_ACCOUNT_REGISTERED;
            case LOGIN_LOCK -> USER_LOGIN_LOCK;
            case NO_PERMISSION -> USER_NO_PERMISSION;
            case ACCOUNT_UNREGISTERED -> USER_ACCOUNT_UNREGISTERED;
            case REMOTE_LOGIN_ERROR -> USER_REMOTE_LOGIN_ERROR;
            case WRONG_ACCOUNT_OR_PASSWORD -> USER_WRONG_ACCOUNT_OR_PASSWORD;
            default -> UNEXPECTED_ERROR;
        };
    }

    public ROEnum setMsg(String msg) {
        defaultMsg = msg;
        return this;
    }
}
